package br.unirio.leilao.action;

import java.util.Date;
import java.util.Map;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.RequestAware;

import br.unirio.leilao.dao.AlbumDAO;
import br.unirio.leilao.dao.MusicaDAO;
import br.unirio.leilao.dao.OfertaCompraDAO;
import br.unirio.leilao.dao.OfertaVendaDAO;
import br.unirio.leilao.dao.UsuarioDAO;
import br.unirio.leilao.entity.Album;
import br.unirio.leilao.entity.ComentarioAlbum;
import br.unirio.leilao.entity.OfertaCompra;
import br.unirio.leilao.entity.OfertaVenda;
import br.unirio.leilao.entity.Usuario;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;


public class AlbumAction extends ActionSupport implements RequestAware{

	private static final long serialVersionUID = 4409401587196824058L;
	
	private Map<String, Object> request;
	AlbumDAO albumDAO;
	MusicaDAO musicaoDAO;
	OfertaVendaDAO ofertaVendaDAO;
	OfertaCompraDAO ofertaCompraDAO;
	private String idEstilo;
	private String idAlbum;
	private String nomeAlbum;
	private String stringBusca;
	private String comentario;
	private float precoInicial;
	private float precoFinal;
	private String descricao;
	private Date dataFinal;
	private String idOfertaVenda;
	private String oferta;

	public AlbumAction() {
		albumDAO = AlbumDAO.getInstance();
		musicaoDAO = MusicaDAO.getInstance();
		ofertaVendaDAO = OfertaVendaDAO.getInstance();
		ofertaCompraDAO = OfertaCompraDAO.getInstance();
	}

	/* 
	 * dado um estilo, lista todos os �lbuns desse estilo;
	 */
	public String listaAlbuns() {
		
		if( idEstilo != null) {
			request.put("albuns", albumDAO.getAlbunsEstilo(Integer.valueOf(idEstilo)));
		}
		
		return SUCCESS;
	}	
	
	/**
	 * pega a lista de musicas, comentarios e ofertas de venda de um album.
	 * @return
	 */
	public String detalhaAlbum() {
		
		if ( idAlbum != null) {
			request.put("musicas", musicaoDAO.getMusicas(Integer.valueOf(idAlbum)));
			request.put("comentarios", albumDAO.getComentarios(Integer.valueOf(idAlbum)));
			request.put("ofertasVenda", ofertaVendaDAO.getOfertasAtivas(Integer.valueOf(idAlbum)));
		}
		
		return SUCCESS;
	}
	
	/**
	 * realiza a busca.
	 * @return
	 */
	public String busca() {
		
		if ( stringBusca != null) {
			request.put("albuns", albumDAO.buscaAlbumMusica(stringBusca));
		}
		
		return SUCCESS;
	}
	
	/**
	 * adiciona um comentario a um album
	 * @return
	 */
	public String adicionarComentario() {
		Usuario usu = new Usuario();
		usu = UsuarioDAO.getInstance().getUsuarioByLogin(String.valueOf(ActionContext.getContext().getSession().get(("userId"))));// pegar usu�rio logado!!!
		ComentarioAlbum comentarioAlbum = new ComentarioAlbum();
		comentarioAlbum.setAlbum(new Album(Integer.valueOf(idAlbum)));
		comentarioAlbum.setUsuario(usu); 
		comentarioAlbum.setComentario(comentario);
		albumDAO.adicionaComentario(comentarioAlbum);
		request.put("musicas", musicaoDAO.getMusicas(Integer.valueOf(idAlbum)));
		request.put("comentarios", albumDAO.getComentarios(Integer.valueOf(idAlbum)));
		request.put("ofertasVenda", ofertaVendaDAO.getOfertasAtivas(Integer.valueOf(idAlbum)));
		return SUCCESS;
	}

	/**
	 * salva uma oferta de venda de um album
	 * @return
	 */
	public String salvarOfertaVenda() {
		
		OfertaVenda ofertaVenda = new OfertaVenda();
		Usuario usu = new Usuario();
		usu = UsuarioDAO.getInstance().getUsuarioByLogin(String.valueOf(ActionContext.getContext().getSession().get(("userId"))));
		ofertaVenda.setUsuario(usu); //pegar usu�rio logado!!!
		ofertaVenda.setDataFim(dataFinal);
		ofertaVenda.setPrecoFinal(precoFinal);
		ofertaVenda.setPrecoInicial(precoInicial);
		ofertaVenda.setDescricao(descricao);
		ofertaVenda.setAlbum(new Album(Integer.valueOf(idAlbum)));
		
		if(descricao.length() == 0) {
			addFieldError("descricao", getText("error.descricao.requerido"));
		}
		
		if(precoFinal <= 0) {
			addFieldError("precoFinal", getText("erro.preco.negativozero"));
		}
		
		if(precoFinal <= 0) {
			addFieldError("precoInicial", getText("erro.preco.negativozero"));
		}
		
		if(dataFinal == null){
			addFieldError("dataFinal", getText("erro.dataVencimento.requerido"));
		}
		
		if (hasErrors())
			return INPUT;
				
		ofertaVendaDAO.registraOfertaVenda(ofertaVenda);
		addActionMessage("oferta salva com sucesso");
		request.put("musicas", musicaoDAO.getMusicas(Integer.valueOf(idAlbum)));
		request.put("comentarios", albumDAO.getComentarios(Integer.valueOf(idAlbum)));
		request.put("ofertasVenda", ofertaVendaDAO.getOfertasAtivas(Integer.valueOf(idAlbum)));
		
		return SUCCESS;
		
	}
	
	/**
	 * pega as ofertas ativa de um album e o seu menor preco
	 */
	public void getOfertasAtivas() {
		
		if(idAlbum != null) {
			ServletActionContext.getRequest().setAttribute("ofertasAtivas", ofertaVendaDAO.getNumeroOfertasAtivas(Integer.valueOf(idAlbum)));
			ServletActionContext.getRequest().setAttribute("menorPreco", ofertaVendaDAO.retornaMenorPrecoAlbum(Integer.valueOf(idAlbum)));			
		}
	}	
	
	/**
	 * vai para pagina de cadastro de oferta de venda
	 * @return
	 */
	public String adicionarOfertaVenda(){
		return INPUT;
	}
	
	/**
	 * vai para pagina de cadastro de oferta de compra
	 * @return
	 */
	public String adicionarOfertaCompra(){
		request.put("ofertaVenda", ofertaVendaDAO.getOferta(Integer.valueOf(idOfertaVenda)));
		request.put("ofertasCompra", ofertaCompraDAO.getOfertasCompras(Integer.valueOf(idOfertaVenda)));
		return INPUT;
	}
	
	/**
	 * cadastra uma compra imediata, encerrando a oferta de venda.
	 * @return
	 */
	public String cadastraCompraImediata() {
		
		Usuario usu = new Usuario();
		usu = UsuarioDAO.getInstance().getUsuarioByLogin(String.valueOf(ActionContext.getContext().getSession().get(("userId"))));
		OfertaCompra ofertaCompra = new OfertaCompra();
		ofertaCompra.setUsuario(usu);
		ofertaCompra.setEncerraOfertaVenda(Boolean.TRUE);
		ofertaCompra.setOfertaVenda(new OfertaVenda(Integer.valueOf(idOfertaVenda)));
		
		ofertaCompraDAO.registraOfertaCompra(ofertaCompra);
		ofertaVendaDAO.encerraOfertavenda(Integer.valueOf(idOfertaVenda));
		
		addActionMessage("Compra realizada com sucesso!");
		request.put("musicas", musicaoDAO.getMusicas(Integer.valueOf(idAlbum)));
		request.put("comentarios", albumDAO.getComentarios(Integer.valueOf(idAlbum)));
		request.put("ofertasVenda", ofertaVendaDAO.getOfertasAtivas(Integer.valueOf(idAlbum)));
				
		return SUCCESS;
	}
	
	/**
	 * cadastra uma oferta de compra
	 * @return
	 */
	public String cadastraOfertaCompra() {
		
		Usuario usu = new Usuario();
		usu = UsuarioDAO.getInstance().getUsuarioByLogin(String.valueOf(ActionContext.getContext().getSession().get(("userId"))));
		OfertaCompra ofertaCompra = new OfertaCompra();
		ofertaCompra.setUsuario(usu);
		ofertaCompra.setEncerraOfertaVenda(Boolean.FALSE);
		ofertaCompra.setOferta(Float.valueOf(oferta));
		ofertaCompra.setOfertaVenda(new OfertaVenda(Integer.valueOf(idOfertaVenda)));
		
		if(Float.valueOf(oferta) <= ofertaVendaDAO.getOferta(Integer.valueOf(idOfertaVenda)).getPrecoInicial()) {
			addFieldError("oferta", getText("erro.oferta.compra.menor.preco.leilao"));
		}
		
		if (hasErrors()) {
			request.put("ofertaVenda", ofertaVendaDAO.getOferta(Integer.valueOf(idOfertaVenda)));
			request.put("ofertasCompra", ofertaCompraDAO.getOfertasCompras(Integer.valueOf(idOfertaVenda)));
		
			return INPUT;				
		
		}
			
		ofertaCompraDAO.registraOfertaCompra(ofertaCompra);
		ofertaVendaDAO.atualizaPrecoInicialOfertavenda(Integer.valueOf(idOfertaVenda), Float.valueOf(oferta));
		addActionMessage("Oferta de compra realizada com sucesso!");
		request.put("musicas", musicaoDAO.getMusicas(Integer.valueOf(idAlbum)));
		request.put("comentarios", albumDAO.getComentarios(Integer.valueOf(idAlbum)));
		request.put("ofertasVenda", ofertaVendaDAO.getOfertasAtivas(Integer.valueOf(idAlbum)));
				
		return SUCCESS;
	}

	@Override
	public void setRequest(Map<String, Object> request) {
		this.request = request;
		
	}

	public void setIdEstilo(String idEstilo) {
		this.idEstilo = idEstilo;
	}

	public String getIdEstilo() {
		return idEstilo;
	}

	public String getIdAlbum() {
		return idAlbum;
	}

	public void setIdAlbum(String idAlbum) {
		this.idAlbum = idAlbum;
	}

	public void setNomeAlbum(String nomeAlbum) {
		this.nomeAlbum = nomeAlbum;
	}

	public String getNomeAlbum() {
		return nomeAlbum;
	}
		
	public String getStringBusca() {
		return stringBusca;
	}

	public void setStringBusca(String stringBusca) {
		this.stringBusca = stringBusca;
	}

	public void setComentario(String comentario) {
		this.comentario = comentario;
	}

	public String getComentario() {
		return comentario;
	}
	
	public float getPrecoInicial() {
		return precoInicial;
	}

	public void setPrecoInicial(float precoInicial) {
		this.precoInicial = precoInicial;
	}

	public float getPrecoFinal() {
		return precoFinal;
	}

	public void setPrecoFinal(float precoFinal) {
		this.precoFinal = precoFinal;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Date getDataFinal() {
		return dataFinal;
	}

	public void setDataFinal(Date dataFinal) {
		this.dataFinal = dataFinal;
	}

	public void setIdOfertaVenda(String idOfertaVenda) {
		this.idOfertaVenda = idOfertaVenda;
	}

	public String getIdOfertaVenda() {
		return idOfertaVenda;
	}

	public void setOferta(String oferta) {
		this.oferta = oferta;
	}

	public String getOferta() {
		return oferta;
	}
}

